#ifndef INDICEBSHARP_H_
#define INDICEBSHARP_H_

#include "Indice.h"
#include <string>

namespace Toolkit
{

class ControladorAlmacenamientoBSharp;
class AdministradorBufferingBSharp;
class Archivo;
class Buffer;

class IndiceBSharp: public Toolkit::Indice
{
public:
    IndiceBSharp(const unsigned long int tamanoComponente,
    		const std::string &ruta, const std::string &nombre, const TipoSerializacion &tSerializacion);

    IndiceBSharp(const std::string &ruta, const std::string &nombre,
    		const TipoSerializacion &tSerializacion);

    virtual ~IndiceBSharp();

    virtual bool eliminar(const Clave &clave);

    virtual void insertar(const Clave & clave, const unsigned long int &posicionBloque);

    virtual bool buscar(const Clave &clave, unsigned long int &posicionBloque) const;

    virtual bool getSiguienteClave(const Clave &clave, Clave*& claveSiguiente) const;

    void imprimirArbol() const;

private:
    friend class AdministradorBufferingBSharp;

    TipoSerializacion tSerializacion;
    const static int OFFSET_BUFFER = 5;

    AdministradorBufferingBSharp* administradorBuffering;
    ControladorAlmacenamientoBSharp* controladorAlmacenamiento;

    /***
     * Almacenamiento primario. De haber indice, se asocia a este almacenamiento.
     * Si la estrategia es de un almacenamiento, se usara a este.
     * */
    Archivo* primario;

    /**
     * Se supone el almacenamiento de acceso rápido (probablemente un buffer).
     * No se le asocia un indice. Si se trabaja con estrategias de dos almacenamientos
     * se utilizará primero a este para las lecturas y escrituras.
     * */
    Buffer* secundario;


};

}

#endif /* INDICEBSHARP_H_ */
